package com.doctcloud.datacloud.service;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.doctcloud.datacloud.entity.PriceLastestEntity;
import com.doctcloud.datacloud.mapper.PriceLastestEntityMapper;
import lombok.RequiredArgsConstructor;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class PriceLastestEntityService extends ServiceImpl<PriceLastestEntityMapper, PriceLastestEntity> {

    private final PriceLastestEntityMapper priceLastestEntityMapper; // 注入Mapper
    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;
    /**
     * 批量保存或更新。
     * 此方法依赖于调用方已经区分好了哪些是需要更新的（从数据库查询出的），哪些是需要插入的（新创建的）。
     *
     * @param entitiesToSaveOrUpdate 包含了待插入和待更新实体的列表
     */
    @Transactional(rollbackFor = Exception.class)
    public void batchSaveOrUpdate(List<PriceLastestEntity> entitiesToSaveOrUpdate) {
        if (CollectionUtils.isEmpty(entitiesToSaveOrUpdate)) {
            return;
        }

        baseMapper.batchUpsert(entitiesToSaveOrUpdate);
//        // 再次查询数据库，获取当前最新的实体状态，用于准确判断
//        // 这是最稳妥的方式，避免了依赖调用方传递状态
//        List<PriceLastestEntity.Key> keysToCheck = entitiesToSaveOrUpdate.stream()
//                .map(entity -> new PriceLastestEntity.Key(
//                        entity.getItemClass(),
//                        entity.getItemCode(),
//                        entity.getItemSpec(),
//                        entity.getUnits()
//                ))
//                .collect(Collectors.toList());
//
//        List<PriceLastestEntity> existingEntitiesInDb = this.listByCompositeKeys(keysToCheck);
//        Map<PriceLastestEntity.Key, PriceLastestEntity> existingEntityMap = existingEntitiesInDb.stream()
//                .collect(Collectors.toMap(
//                        entity -> new PriceLastestEntity.Key(
//                                entity.getItemClass(),
//                                entity.getItemCode(),
//                                entity.getItemSpec(),
//                                entity.getUnits()
//                        ),
//                        entity -> entity
//                ));
//
//        List<PriceLastestEntity> toInsert = new ArrayList<>();
//        List<PriceLastestEntity> toUpdate = new ArrayList<>();
//
//        for (PriceLastestEntity entity : entitiesToSaveOrUpdate) {
//            PriceLastestEntity.Key key = new PriceLastestEntity.Key(
//                    entity.getItemClass(),
//                    entity.getItemCode(),
//                    entity.getItemSpec(),
//                    entity.getUnits()
//            );
//
//            // 如果这个实体在数据库中存在，则执行更新；否则，执行插入
//            if (existingEntityMap.containsKey(key)) {
//                toUpdate.add(entity);
//            } else {
//                toInsert.add(entity);
//            }
//        }
//
//        // 批量插入新记录
//        if (!toInsert.isEmpty()) {
//            // 使用 Mybatis-Plus 的 saveBatch 方法
//            this.saveBatch(toInsert);
//        }
//
//        // 批量更新已有记录
//        if (!toUpdate.isEmpty()) {
//            PriceLastestEntityMapper mapper = sqlSessionTemplate.getMapper(PriceLastestEntityMapper.class);
//            for (PriceLastestEntity entity : toUpdate) {
//                // 调用单条更新的方法
//                mapper.updateByPrimaryKey(entity);
//            }
//        }
    }

    /**
     * 批量查询（按复合主键）
     */
    public List<PriceLastestEntity> listByCompositeKeys(List<PriceLastestEntity.Key> keys) {
        if (CollectionUtils.isEmpty(keys)) {
            return new ArrayList<>();
        }
        // 调用Mapper的批量查询方法（XML中实现）
        return priceLastestEntityMapper.selectByCompositeKeys(keys);
    }

    /**
     * 批量更新价格信息
     * @param list 包含多个待更新实体的列表
     */
    @Transactional
    public void batchUpdate(List<PriceLastestEntity> list) {
        // 获取批量执行的 Mapper
        PriceLastestEntityMapper batchMapper = sqlSessionTemplate.getMapper(PriceLastestEntityMapper.class);

        for (PriceLastestEntity entity : list) {
            // 循环调用单条更新方法
            batchMapper.updateByPrimaryKey(entity);
        }

    }

}